#pragma once
#include<iostream>
#include<pthread.h>
#include<signal.h>
#include"TcpServer.hpp"
#include"Task.hpp"
#include"Log.hpp"
#include"ThreadPool.hpp"
#define PORT 8081

class HttpServer
{
    private:
        int port;
        bool stop;
    public:
        HttpServer(int _port=PORT)
            :port(_port),stop(false)
        {}

        void InitServer()
        {
            // 信号SIGPIPE需要忽略，如果不忽略，写入出错会导致server崩溃
            signal(SIGPIPE,SIG_IGN);
        }
        
        void Loop()
        {
            TcpServer* tsvr=TcpServer::getinstance(port);
            LOG(INFO,"loop begin");
            while(!stop)
            {
                struct sockaddr_in peer;
                socklen_t len=sizeof(peer);

                int sock=accept(tsvr->Sock(),(struct sockaddr*)&peer,&len);
                if(sock<0)
                {
                    continue;
                }
                LOG(INFO,"get a new link");
                
                // 创建新线程的方式处理
                // int* _sock=new int(sock);
                // pthread_t tid;
                // pthread_create(&tid,nullptr,Entrance::HandlerRequest,_sock);
                // pthread_detach(tid);

                // 生产者消费者模型方式处理
                Task task(sock); // 生产任务
                ThreadPool::getinstance()->PushTask(task); // 消费任务
            }

        }
        ~HttpServer()
        {}
};